package Arrays;

import java.util.Arrays;
import java.util.Comparator;

public class test {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};


        //to String : 将数组变成字符串
        System.out.println("---------------------to String-----------------------");
        System.out.println(Arrays.toString(arr));


        //binarySearch：二分法查找元素(返回对应索引)
        //二分查找前提：数组中的元素必须是有序（升序的）
        //如果查找的元素不存在，返回的是 ： -插入点-1
        //如20若存在的话  应该  出现在在插入点（索引）：10的位置，返回-10-1
        //减一  ：是因为如果查找的数字是 0 ，则插入点会变成 0 结果为 -0（0） ，为了避免误会才减一
        System.out.println("---------------------binarySearch-----------------------");
        System.out.println(Arrays.binarySearch(arr, 10));
        System.out.println(Arrays.binarySearch(arr, 2));
        System.out.println(Arrays.binarySearch(arr, 20));


        //copyOf：拷贝数组
        //参数一：老数组
        //参数二：新数组的长度
        //如果新数组的长度是小于老数组的长度，就会从0索引开始部分拷贝
        //如果新数组的长度是等于老数组的长度，就会完全拷贝
        //如果新数组的长度是大于老数组的长度，剩余的部分都补上初始化值  0
        System.out.println("---------------------copyOf-----------------------");
        int[] ints1 = Arrays.copyOf(arr, 10);
        int[] ints2 = Arrays.copyOf(arr, 20);
        int[] ints3 = Arrays.copyOf(arr, 5);
        System.out.println(Arrays.toString(ints1));
        System.out.println(Arrays.toString(ints2));
        System.out.println(Arrays.toString(ints3));


        //copyOfRange：拷贝数组（可以指定范围）
        //包头不包尾，包左不包右
        //参数二：拷贝的起始索引
        //参数三：拷贝的结束索引（不包含）
        System.out.println("---------------------copyOfRange-----------------------");
        int[] ints4 = Arrays.copyOfRange(arr, 0, 9);
        System.out.println(Arrays.toString(ints4));


        //fill：填充数组
        //拿参数二填充入参数一的数组（覆盖原来的数据）
        System.out.println("---------------------fill-----------------------");
        Arrays.fill(arr, 100);
        System.out.println(Arrays.toString(arr));


        //sort：
        // 默认情况下，给基本数据类型进行升序排列，底层使用的是快速排序。
        System.out.println("--------------------sort------------------------");
        int[] arr2 = {10, 5, 6, 8, 9, 7, 1, 3, 2, 4};
        Arrays.sort(arr2);
        System.out.println(Arrays.toString(arr2));//[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

        //实现降序要使用数据对应的包装类
        Integer[] arr3 = {10, 5, 6, 8, 9, 7, 1, 3, 2, 4};
        //第二个参数是一个接口，调用方法的时候，需要传递这个接口的  实现类对象 ，作为排序的规则
        //由于这个实现类只是用一次，所以没有必要去单独写一个类，直接采用匿名内部类的方式就行
        //o1-o2:升序排列
        //o2-o1:降序排列
        Arrays.sort(arr3, (o1, o2) -> o2 - o1);
        System.out.println(Arrays.toString(arr3));

    }
}
